#include <iostream>
#include <unistd.h>
#include <signal.h>

void FatherExit(int sig);  // 父进程的信号处理函数
void ChildExit(int sig);  // 子进程的信号处理函数

int main()
{
    // 忽略所有的信号，不希望被打扰
    for (int i = 0; i < 64; i++)
    {
        signal(i, SIG_IGN);
    }

    // 设置信号，在shell下可用 kill 进程号 或 ctrl c 正常终止进程
    // 不要使用 kill -9 进程号  强行终止
    signal(SIGTERM, FatherExit);
    signal(SIGINT, FatherExit);

    while (true)
    {
        if (fork() > 0)
        {
            // 父进程的流程
            sleep(5);
            continue;
        }
        else
        {
            // 子进程的流程
            // 子进程需要重新设置信号
            signal(SIGTERM, ChildExit);
            signal(SIGINT, SIG_IGN);  // 子进程忽略ctrl c信号

            while (true)
            {
                std::cout << "子进程" << getpid() << "正在运行中" << std::endl;
                sleep(3);
                continue;
            }
            
        }
        
    }
    
    
}

void FatherExit(int sig)
{
    // 防止信号处理函数在执行的过程中再次被信号中断
    signal(SIGINT, SIG_IGN);
    signal(SIGTERM, SIG_IGN);

    std::cout << "父进程退出,sig=" << sig << std::endl;

    kill(0, SIGTERM);   // 通知全部的子进程退出

    exit(0);
}

void ChildExit(int sig)
{
    signal(SIGINT, SIG_IGN);
    signal(SIGTERM, SIG_IGN);

    std::cout << "子进程" << getpid() << "退出,sig=" << sig << std::endl;

    exit(0);
}